package com.king.base;

import java.util.List;

import com.google.common.base.Preconditions;

import static com.google.common.collect.Lists.newArrayList;

/**
 * @author taomk
 * @version 1.0
 * @since 15-1-31 上午9:11
 */
public class PreconditionsTest {

	public static void main(String [] args) throws Exception {
		testPreconditions();
	}

	public static void testPreconditions() throws Exception {

		getPersonByPrecondition(8,"taobangren");

		try {
			getPersonByPrecondition(-9,"taobangren");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		try {
			getPersonByPrecondition(8,"");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		try {
			getPersonByPrecondition(8,null);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		List<Integer> intList= newArrayList();
		try {
			for(int i = 0; i < 10; i++) {
				checkState(intList,9);
				intList.add(i);
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		try {
			checkPositionIndex(intList,3);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		try {
			checkPositionIndex(intList,13);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		try {
			checkPositionIndexes(intList,3,7);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		try {
			checkPositionIndexes(intList,3,17);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		try {
			checkPositionIndexes(intList,13,17);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		try {
			checkElementIndex(intList,6);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		try {
			checkElementIndex(intList,16);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	public static void getPersonByPrecondition(int age,String name) throws Exception {
		// 检查value不为null, 直接返回value
		// 失败时抛出的异常类型：NullPointerException
		Preconditions.checkNotNull(name, "name为null");

		// 检查boolean是否为真
		// 失败时抛出的异常类型: IllegalArgumentException
		Preconditions.checkArgument(name.length() > 0, "name为\'\'");
		Preconditions.checkArgument(age > 0, "age 必须大于0");

		System.out.println("a person age:"+age+",name:"+name);

	}

	public static void checkState(List<Integer> intList,int index) throws Exception {
		// 检查对象的一些状态, 不依赖方法参数
		// 失败时抛出的异常类型：IllegalStateException
		Preconditions.checkState(intList.size() < index, " intList size 不能大于" + index);
	}

	public static void checkPositionIndex(List<Integer> intList,int index) throws Exception{
		// 检查位置index是否为在一个长度为size的list， string或array合法的范围。
		// index的范围区间是[0， size)(包含0不包含size)。无需直接传入list， string或array， 只需传入大小。返回index。
		// 失败时抛出的异常类型：IndexOutOfBoundsException
		Preconditions.checkPositionIndex(index, intList.size(), "index "+index+" 不在 list中， List size为："+intList.size());
	}

	public static void checkPositionIndexes(List<Integer> intList,int start,int end) throws Exception{
		// 检查[start, end)是一个长度为size的list， string或array合法的范围子集。伴随着错误信息。
		// 失败时抛出的异常类型：IndexOutOfBoundsException
		Preconditions.checkPositionIndexes(start, end, intList.size());
	}

	public static void checkElementIndex(List<Integer> intList,int index) throws Exception{
		// 检查index是否为在一个长度为size的list， string或array合法的范围。 index的范围区间是[0, size)(包含0不包含size)。
		// 无需直接传入list， string或array， 只需传入大小。返回index。
		// 失败时抛出的异常类型：IndexOutOfBoundsException
		Preconditions.checkElementIndex(index, intList.size(),"index 为 "+index+" 不在 list中， List size为： "+intList.size());
	}
}
